import 'dart:math';

import 'package:dart_sm/dart_sm.dart';

class SmCryptoUtils {
  /// sm3哈希算法
  /// @param plainText 需要计算的明文
  static String sm3Hash(String plainText) {
    return SM3.hash(plainText);
  }

  /// sm4设置全局密钥,效率比每次加解密时设置密钥高
  /// @param key 全局秘钥，16进制字符串，要求为128位
  static void sm4SetGlobalKey(String key) {
    SM4.setKey(key);
  }

  /// 生成sm4密钥
  /// @param len 长度,默认位32个字符,128位
  static String sm4GenerateKey([int len = 32]) {
    final random = Random();
    final StringBuffer buffer = StringBuffer();
    for (int i = 0; i < len; i++) {
      buffer.write(random.nextInt(16).toRadixString(16));
    }
    return buffer.toString();
  }

  /// sm4加密,cbc模式,使用 pkcs#7 填充
  /// @param plainText 明文
  /// @param key 密钥,16进制串，要求为128位
  /// @param iv 向量,16进制字符串，要求为128位
  static String sm4Encrypt(String plainText, String key, String iv) {
    return SM4.encrypt(plainText, mode: SM4CryptoMode.CBC, iv: iv, key: key);
  }

  /// sm4解密,cbc模式,使用 pkcs#7 填充
  /// @param cipherText 密文,16进制串
  /// @param key 密钥,16进制串，要求为128位
  /// @param iv 向量,16进制字符串，要求为128位
  static String sm4Decrypt(String cipherText, String key, String iv) {
    return SM4.decrypt(cipherText, mode: SM4CryptoMode.CBC, iv: iv, key: key);
  }

  /// 生成sm2私钥和公钥对
  static KeyPair sm2GenerateKeyPairHex() {
    return SM2.generateKeyPair();
  }

  /// 生成压缩公钥
  /// @param publicKey 公钥,16进制字符串
  static String sm2CompressPublicKeyHex(String publicKey) {
    return SM2.compressPublicKey(publicKey);
  }

  /// 验证公钥是否为椭圆曲线上的点
  /// @param publicKey 公钥,16进制字符串
  static bool sm2VerifyPublicKey(String publicKey) {
    return SM2.verifyPublicKey(publicKey);
  }

  /// 验证公钥是否等价，等价返回true
  /// @param publicKey1 公钥1,16进制字符串
  /// @param publicKey2 公钥2,16进制字符串
  static bool sm2ComparePublicKeyHex(String publicKey1, String publicKey2) {
    return SM2.comparePublicKey(publicKey1, publicKey2);
  }

  /// sm2加密
  /// @param plainText 明文
  /// @param publicKey 公钥,16进制字符串
  /// @param cipherMode 加密模式: 1 - C1C3C2，0 - C1C2C3，默认为1
  static String sm2Encrypt(String plainText, String publicKey, [int cipherMode = C1C3C2]) {
    return SM2.encrypt(plainText, publicKey, cipherMode: cipherMode);
  }

  /// sm2解密
  /// @param cipherText 密文,16进制字符串
  /// @param privateKey 私钥,16进制字符串
  /// @param cipherMode 加密模式: 1 - C1C3C2，0 - C1C2C3，默认为1
  static String sm2Decrypt(String cipherText, String privateKey, [int cipherMode = C1C3C2]) {
    return SM2.decrypt(cipherText, privateKey, cipherMode: cipherMode);
  }

  /// 签名
  /// @param plainText 明文
  /// @param privateKey 私钥,16进制字符串
  static String sm2Signature(String plainText, String privateKey) {
    return SM2.signature(plainText, privateKey,hash: true, der: true);
  }

  /// 验签
  /// @param plainText 明文
  /// @param signHex 签名值,16进制字符串
  /// @param publicKey 公钥,16进制字符串
  static bool sm2VerifySignature(String plainText, String signHex, String publicKey) {
    return SM2.verifySignature(plainText, signHex, publicKey,hash: true, der: true);
  }
}
